/*
 ============================================================================
 Name        : ejercicio01.c
 Author      : mmino
 Version     : 1.0
 TP N 1      : Ejercicio N 1
 Description : C, Ansi-style
 ============================================================================
 */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int getrand(int min, int max) {

	static int init = 0;
	int num;
	if (!init) {
		srand(time(0));
		init = 1;
	}
	num = (int) rand();
	num = num % (abs(max - min) + 1) + 1;
	return num;

}

int main(void) {
	int i,j;
	pid_t child,nieto;
	int condicion,condicion_nietos;

	printf("Proceso Padre pid   p = %d ppid  p = %d \n ", getpid(), getppid());

	for (i = 0; i < 2; i++) {

		int nietos = getrand(1, 3);
		child = fork();

		if (child == -1) {

			perror("fork");
			exit(EXIT_FAILURE);

		} else if (child == 0) {

			printf("\tProceso hijo %d pid = %d, ppid = %d  \n", i, getpid(),	getppid());

			for (j = 0; j < nietos; j++) {
				nieto = fork();
				if (nieto == -1) {
					perror("fork");
					exit(EXIT_FAILURE);
				} else if (nieto == 0) {
					printf("\t\tProceso hijo %d nieto %d pid = %d, ppid = %d  \n",i,j,getpid(), getppid());
					//sleep(getrand(1, 3));
					exit(0);
					break;
				}
				//else{
					//waitpid(nieto,&condicion_nietos,0);
					//wait(&condicion_nietos);
					//printf("\tFinalizado Hijos de pid = %d, ppid = %d  \n",getpid(), getppid());
				//}
			}

			for (i = 0; i < nietos; i++)
				wait(&condicion_nietos);

			printf("\tFinalizado Hijos %d de pid = %d, ppid = %d  \n",i,getpid(), getppid());

			exit(0);
			break;


		}
		//else{
		//	waitpid(child,&condicion,0);
		//	printf("\tFinalizado Hijos  pid = %d, ppid = %d  \n",getpid(), getppid());
		//}
	}
	for (i = 0; i < 2; i++)
		wait(&condicion);

	printf("Finalizado Padre  pid = %d, ppid = %d  \n",getpid(), getppid());



	exit(EXIT_SUCCESS);

}


main__() {
	pid_t pid;
	int condicion;

	int i = 0, k = 0;
	printf("PID %d \n", getpid());

	for (k = 0; k < 10; k++) {
		pid = fork();
		switch (pid) {
		case -1: // error del fork
			perror("Error en el fork");
			break;
		case 0: // proceso hijo
			printf("Soy el hijo: PID %d y mi padre es PPID = %d\n", getpid(),
					getppid());
			exit(0);
			break;
		}
	}
	wait(&condicion);
	printf("Soy el padre: PID %d; PPID = %d \n", getpid(), getppid());
}
